#include <rtthread.h>
#include <rtdef.h>
#include "bf0_hal.h"
#include "drv_io.h"
#include "stdio.h"
#include "string.h"
//#include "app.h"
/*
#include <stdlib.h>
#include <time.h>
#include <sys/socket.h>
#include <netdb.h>

const char* host_name = "ntp1.aliyun.com";

void get_ntp_time_with_host(const char* host_name)
{
    // 假设你的ntp_get_time函数接受一个const char*参数
    time_t ntp_time = ntp_get_time("ntp1.aliyun.com"); // 传递NTP服务器地址
    if (ntp_time != 0) {
        rt_kprintf("NTP time from %s: %s", host_name, ctime(&ntp_time));
        rt_timeset(ntp_time);
    } else {
        rt_kprintf("Failed to get NTP time from %s.\n", host_name);
    }
}
*/

/* Common functions for RT-Thread based platform -----------------------------------------------*/
/**
  * @brief  Initialize board default configuration.
  * @param  None
  * @retval None
  */
void HAL_MspInit(void)
{
    //__asm("B .");        /*For debugging purpose*/
    BSP_IO_Init();
}
/* User code start from here --------------------------------------------------------*/
#include "bts2_app_inc.h"
#include "ble_connection_manager.h"
#include "bt_connection_manager.h"

#ifdef OTA_55X
    #include "dfu_service.h"  // 如果定义了OTA_55X，则包含DFU服务头文件
#endif

#include "ulog.h"  // 包含日志功能头文件

#define BT_APP_READY 1  // 蓝牙应用准备就绪标志

#define BT_APP_CONNECT_PAN  1  // 蓝牙PAN连接标志
#define PAN_TIMER_MS        3000  // PAN连接定时器时间（毫秒）

// 蓝牙应用程序环境结构体
typedef struct
{
    BOOL bt_connected;  // 蓝牙连接状态
    bt_notify_device_mac_t bd_addr;  // 蓝牙设备MAC地址
    rt_timer_t pan_connect_timer;  // PAN连接定时器
} bt_app_t;

static bt_app_t g_bt_app_env;  // 全局蓝牙应用环境变量
static rt_mailbox_t g_bt_app_mb;  // 蓝牙应用邮箱

/*********************
 *      蓝牙pan状态结构体
 *********************/
// 蓝牙PAN状态结构体（注释中提到的是步数数据结构，但实际是PAN状态）
typedef struct {
    rt_bool_t sifli_enable;  // SIFLI使能状态
    rt_mutex_t lock;         // 数据保护互斥锁
} bt_pan_status;

static bt_pan_status bt_data = {
    .sifli_enable = false,  // 初始时SIFLI未使能
    .lock = RT_NULL         // 初始时互斥锁为空
};

// PAN连接超时处理函数
void bt_app_connect_pan_timeout_handle(void *parameter)
{
    // 如果邮箱不为空且蓝牙已连接，则发送PAN连接消息
    if ((g_bt_app_mb != NULL) && (g_bt_app_env.bt_connected))
        rt_mb_send(g_bt_app_mb, BT_APP_CONNECT_PAN);
    return;
}

// 蓝牙应用接口事件处理函数
static int bt_app_interface_event_handle(uint16_t type, uint16_t event_id, uint8_t *data, uint16_t data_len)
{
    if (type == BT_NOTIFY_COMMON)  // 通用蓝牙通知事件
    {
        int pan_conn = 0;  // PAN连接标志

        switch (event_id)
        {
        case BT_NOTIFY_COMMON_BT_STACK_READY:  // 蓝牙协议栈准备就绪
        {
            rt_mb_send(g_bt_app_mb, BT_APP_READY);  // 发送准备就绪消息
        }
        break;
        case BT_NOTIFY_COMMON_ACL_DISCONNECTED:  // ACL断开连接
        {
            bt_notify_device_base_info_t *info = (bt_notify_device_base_info_t *)data;
            LOG_I("disconnected(0x%.2x:%.2x:%.2x:%.2x:%.2x:%.2x) res %d", info->mac.addr[5],
                  info->mac.addr[4], info->mac.addr[3], info->mac.addr[2],
                  info->mac.addr[1], info->mac.addr[0], info->res);
            g_bt_app_env.bt_connected = FALSE;  // 设置连接状态为断开
            memset(&g_bt_app_env.bd_addr, 0xFF, sizeof(g_bt_app_env.bd_addr));  // 清空MAC地址

            if (g_bt_app_env.pan_connect_timer)
                rt_timer_stop(g_bt_app_env.pan_connect_timer);  // 停止PAN连接定时器
        }
        break;
        case BT_NOTIFY_COMMON_ENCRYPTION:  // 加密完成
        {
            bt_notify_device_mac_t *mac = (bt_notify_device_mac_t *)data;
            LOG_I("Encryption competed");
            g_bt_app_env.bd_addr = *mac;  // 保存设备MAC地址
            pan_conn = 1;  // 设置PAN连接标志
        }
        break;
        case BT_NOTIFY_COMMON_PAIR_IND:  // 配对完成指示
        {
            bt_notify_device_base_info_t *info = (bt_notify_device_base_info_t *)data;
            LOG_I("Pairing completed %d", info->res);
            if (info->res == BTS2_SUCC)  // 如果配对成功
            {
                g_bt_app_env.bd_addr = info->mac;  // 保存设备MAC地址
                pan_conn = 1;  // 设置PAN连接标志
            }
        }
        break;
        default:
            break;
        }

        if (pan_conn)  // 如果需要进行PAN连接
        {
            LOG_I("bd addr 0x%.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n", g_bt_app_env.bd_addr.addr[5],
                  g_bt_app_env.bd_addr.addr[4], g_bt_app_env.bd_addr.addr[3],
                  g_bt_app_env.bd_addr.addr[2], g_bt_app_env.bd_addr.addr[1],
                  g_bt_app_env.bd_addr.addr[0]);
            g_bt_app_env.bt_connected = TRUE;  // 设置连接状态为已连接
            // 创建或重启PAN连接定时器，避免SDP冲突
            if (!g_bt_app_env.pan_connect_timer)
                g_bt_app_env.pan_connect_timer = rt_timer_create("connect_pan", bt_app_connect_pan_timeout_handle, (void *)&g_bt_app_env,
                                                 rt_tick_from_millisecond(PAN_TIMER_MS), RT_TIMER_FLAG_SOFT_TIMER);
            else
                rt_timer_stop(g_bt_app_env.pan_connect_timer);
            rt_timer_start(g_bt_app_env.pan_connect_timer);
        }
    }
    else if (type == BT_NOTIFY_PAN)  // PAN相关事件
    {
        switch (event_id)
        {
        case BT_NOTIFY_PAN_PROFILE_CONNECTED:  // PAN配置文件连接成功
        {
            LOG_I("pan connect successed \n");
            if (g_bt_app_env.pan_connect_timer)
            {
                rt_timer_stop(g_bt_app_env.pan_connect_timer);  // 停止定时器
            }
        }
        break;
        case BT_NOTIFY_PAN_PROFILE_DISCONNECTED:  // PAN配置文件断开连接
        {
            LOG_I("pan disconnect with remote device\n");
        }
        break;
        default:
            break;
        }
    }

    return 0;
}

// 获取蓝牙设备类别
uint32_t bt_get_class_of_device()
{
    return (uint32_t)BT_SRVCLS_NETWORK | BT_DEVCLS_LAP | BT_LAP_FULLY;
}

/**
  * @brief  主程序
  * @param  None
  * @retval 0 if success, otherwise failure number
  */
#ifdef BT_DEVICE_NAME
    static const char *local_name = BT_DEVICE_NAME;  // 如果定义了设备名，则使用定义的名称
#else
    static const char *local_name = "watch";  // 否则使用默认名称"watch"
#endif

// 蓝牙SIFLI初始化函数
int bt_sifli_init(void)
{
    g_bt_app_mb = rt_mb_create("bt_app", 8, RT_IPC_FLAG_FIFO);  // 创建邮箱
#ifdef BSP_BT_CONNECTION_MANAGER
    bt_cm_set_profile_target(BT_CM_HID, BT_LINK_PHONE, 1);  // 设置蓝牙配置文件目标
#endif // BSP_BT_CONNECTION_MANAGER

    bt_interface_register_bt_event_notify_callback(bt_app_interface_event_handle);  // 注册蓝牙事件回调函数

    sifli_ble_enable();  // 使能SIFLI BLE

    bt_data.sifli_enable = true;  // 设置SIFLI使能标志

    return 0;
}

// 蓝牙应用线程函数
static void open_bt_app_thread(void *argpan)
{
    uint8_t tmp = 0;
    while(1)
    {
        uint32_t value;
        // 等待栈/配置文件准备就绪
        if (RT_EOK == rt_mb_recv(g_bt_app_mb, (rt_uint32_t *)&value, 8000) && value == BT_APP_READY)
        {
            LOG_I("BT/BLE stack and profile ready");
        }
        else
        {
            LOG_I("BT/BLE stack and profile init failed");
        }

        // 更新蓝牙名称
        bt_interface_set_local_name(strlen(local_name), (void *)local_name);

        // 处理PAN连接事件
        rt_mb_recv(g_bt_app_mb, (rt_uint32_t *)&value, RT_WAITING_FOREVER);
        if (value == BT_APP_CONNECT_PAN)
        {
            if (g_bt_app_env.bt_connected)
                bt_interface_conn_ext((char *)&g_bt_app_env.bd_addr, BT_PROFILE_PAN);  // 连接PAN配置文件
        }
    }
}

/*********************
 *      服务初始化
 *********************/
// 蓝牙PAN服务启动函数
int btpan_service_start(void)
{
    if(!bt_data.sifli_enable)
    {
        bt_sifli_init();  // 如果SIFLI未使能，则初始化
    }
    rt_thread_t thread;
    
    // 如果已经初始化，直接返回
    if (bt_data.lock != RT_NULL) {
        return 0;
    }
    
    // 创建互斥锁
    bt_data.lock = rt_mutex_create("btpan_mutex", RT_IPC_FLAG_FIFO);
    if (bt_data.lock == RT_NULL) {
        rt_kprintf("Failed to create step service mutex\n");
        return -1;
    }
    
    // 创建并启动蓝牙PAN服务线程
    thread = rt_thread_create("btpan_service",
                             open_bt_app_thread,
                             RT_NULL,
                             2048,
                             20,
                             20);
    
    if (thread != RT_NULL) {
        rt_thread_startup(thread);
        rt_kprintf("btpan service started\n");
        return 0;
    } else {
        rt_kprintf("Failed to create btpan service thread\n");
        rt_mutex_delete(bt_data.lock);
        bt_data.lock = RT_NULL;
        return -2;
    }
}